#! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! FME_PYTHON_VERSION 27 GUI IGNORE SourceDataset_NGRID_1,NGRID_IN_SEARCH_ENVELOPE_MINX_NGRID_1,NGRID_IN_SEARCH_ENVELOPE_MINY_NGRID_1,NGRID_IN_SEARCH_ENVELOPE_MAXX_NGRID_1,NGRID_IN_SEARCH_ENVELOPE_MAXY_NGRID_1,NGRID_IN_CLIP_TO_ENVELOPE_NGRID_1,SEARCH_ENVELOPE_COORDINATE_SYSTEM_NGRID_1,DestDataset_TEXTLINE_1,TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_1,TEXTLINE_OUT_END_OF_LINE_TEXTLINE_1,TEXTLINE_OUT_WRITE_LAST_EOL_TEXTLINE_1,TEXTLINE_OUT_ENCODING_TEXTLINE_1,TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_1 DEFAULT_MACRO DestDataset_TEXTLINE $(FME_MF_DIR)GridData\EGM08_REDNAP.grd GUI FILENAME DestDataset_TEXTLINE Text/Compressed_Text_Files(*.txt;*.txt.gz)|*.txt;*.txt.gz|Text_Files(*.txt)|*.txt|Compressed_Text_Files(*.txt.gz)|*.txt.gz|All_files(*.*)|*.* Destination Text File: INCLUDE [ if {{$(DestDataset_TEXTLINE)} == {}} { puts_real {Parameter 'DestDataset_TEXTLINE' must be given a value.}; exit 1; }; ] #! START_HEADER #! START_WB_HEADER READER_TYPE NGRID READER_KEYWORD NGRID_1 READER_GEN_DIRECTIVES GROUP_BY_DATASET,No,SEARCH_ENVELOPE_MINX,0,SEARCH_ENVELOPE_MINY,0,_MERGE_SCHEMAS,YES,CLIP_TO_ENVELOPE,NO,USE_SEARCH_ENVELOPE,NO,SEARCH_ENVELOPE_MAXX,0,SEARCH_ENVELOPE_MAXY,0,NGRID_EXPOSE_FORMAT_ATTRS, WRITER_TYPE MULTI_WRITER MULTI_WRITER_DATASET_ORDER BY_ID MULTI_WRITER_FIRST_WRITER_ID 0 MULTI_WRITER_TYPE{0} TEXTLINE MULTI_WRITER_KEYWORD{0} TEXTLINE_1 #! END_WB_HEADER #! START_WB_HEADER MACRO WB_KEYWORD "NGRID_1" #! END_WB_HEADER #! START_SOURCE_HEADER NGRID NGRID_1 # ============================================================================ # The following GUI line prompts for a directory to be used as the # source of the NGrid based files. # The user input is stored in a macro, which is then used to define # the dataset to be read. # The dataset this mapping file was generated from was: #! END_SOURCE_HEADER #! START_WB_HEADER DEFAULT_MACRO SourceDataset INCLUDE [ if {{$(SourceDataset)} != ""} { \ puts {DEFAULT_MACRO SourceDataset_NGRID_1 $(SourceDataset)} \ } ] #! END_WB_HEADER #! START_SOURCE_HEADER NGRID NGRID_1 DEFAULT_MACRO SourceDataset_NGRID_1 $(FME_MF_DIR)official\EGM08_REDNAP.grd GUI MULTIFILE SourceDataset_NGRID_1 Vertical_Mapper_Grid_Files(*.grd;*.grc)|*.grd;*.grc|Vertical_Mapper_Continuous_Grid_Files(*.grd)|*.grd|Vertical_Mapper_Classified_Grid_Files(*.grc)|*.grc|All_Files(*.*)|*.* Source Vertical Mapper Grid (NGrid) File(s): NGRID_1_READER_META_ATTRIBUTES fme_basename DEFAULT_MACRO NGRID_IN_GROUP_BY_DATASET_NGRID_1 No NGRID_1_GROUP_BY_DATASET "$(NGRID_IN_GROUP_BY_DATASET_NGRID_1)" # Include this file in source setting section to add external search envelope processing # Zero as a default means we don't do any search -- this makes workbench happier # =========================================================================== DEFAULT_MACRO NGRID_IN_SEARCH_ENVELOPE_MINX_NGRID_1 0 NGRID_1_SEARCH_ENVELOPE "$(NGRID_IN_SEARCH_ENVELOPE_MINX_NGRID_1)" GUI OPTIONAL FLOAT NGRID_IN_SEARCH_ENVELOPE_MINX_NGRID_1 Minimum X: # =========================================================================== DEFAULT_MACRO NGRID_IN_SEARCH_ENVELOPE_MINY_NGRID_1 0 NGRID_1_SEARCH_ENVELOPE "$(NGRID_IN_SEARCH_ENVELOPE_MINY_NGRID_1)" GUI OPTIONAL FLOAT NGRID_IN_SEARCH_ENVELOPE_MINY_NGRID_1 Minimum Y: # =========================================================================== DEFAULT_MACRO NGRID_IN_SEARCH_ENVELOPE_MAXX_NGRID_1 0 NGRID_1_SEARCH_ENVELOPE "$(NGRID_IN_SEARCH_ENVELOPE_MAXX_NGRID_1)" GUI OPTIONAL FLOAT NGRID_IN_SEARCH_ENVELOPE_MAXX_NGRID_1 Maximum X: # =========================================================================== DEFAULT_MACRO NGRID_IN_SEARCH_ENVELOPE_MAXY_NGRID_1 0 NGRID_1_SEARCH_ENVELOPE "$(NGRID_IN_SEARCH_ENVELOPE_MAXY_NGRID_1)" GUI OPTIONAL FLOAT NGRID_IN_SEARCH_ENVELOPE_MAXY_NGRID_1 Maximum Y: # =========================================================================== # BUG18999: We now have a soft clip to fall back on like native spatial index # thus we are reintroducing the clip to envelop as an option for users. # Defualt to soft clip as per the existing database readers we are emulating DEFAULT_MACRO NGRID_IN_CLIP_TO_ENVELOPE_NGRID_1 NO NGRID_1_CLIP_TO_ENVELOPE "$(NGRID_IN_CLIP_TO_ENVELOPE_NGRID_1)" GUI OPTIONAL CHECKBOX NGRID_IN_CLIP_TO_ENVELOPE_NGRID_1 YES%NO Clip to Search Envelope # PR:31021 # Include this file in workbench source preamble section to enable the ability # to specify a coordinate system for search envelope processing # =========================================================================== DEFAULT_MACRO SEARCH_ENVELOPE_COORDINATE_SYSTEM_NGRID_1 GUI OPTIONAL COORDSYS SEARCH_ENVELOPE_COORDINATE_SYSTEM_NGRID_1 Search Envelope Coordinate System: NGRID_1_SEARCH_ENVELOPE_COORDINATE_SYSTEM "$(SEARCH_ENVELOPE_COORDINATE_SYSTEM_NGRID_1)" # =========================================================================== NGRID_1_DATASET "$(SourceDataset_NGRID_1)" #! END_SOURCE_HEADER #! START_WB_HEADER MACRO WB_KEYWORD "TEXTLINE_1" #! END_WB_HEADER #! START_DEST_HEADER TEXTLINE TEXTLINE_1 # ===================================================================== # The following GUI line prompts for a directory to be used as the # the destination for the TextLine files. The user input is stored in # a macro, which is then used to define the dataset to be written. #! END_DEST_HEADER #! START_WB_HEADER DEFAULT_MACRO DestDataset INCLUDE [ if {"$(DestDataset)" != ""} { \ puts {DEFAULT_MACRO DestDataset_TEXTLINE_1 $(DestDataset)} \ } ] #! END_WB_HEADER #! START_DEST_HEADER TEXTLINE TEXTLINE_1 DEFAULT_MACRO DestDataset_TEXTLINE_1 $(DestDataset_TEXTLINE) GUI FILENAME DestDataset_TEXTLINE_1 Text/Compressed_Text_Files(*.txt;*.txt.gz)|*.txt;*.txt.gz|Text_Files(*.txt)|*.txt|Compressed_Text_Files(*.txt.gz)|*.txt.gz|All_files(*.*)|*.* Destination Text File: # ===================================================================== # The following GUI line prompts for the overwrite flag. The default is # YES. Possible values are YES or NO. Any value other than NO or # no is interpreted as YES. DEFAULT_MACRO TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_1 YES TEXTLINE_1_OVERWRITE_FILE "$(TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_1)" GUI CHOICE TEXTLINE_OUT_OVERWRITE_FILE_TEXTLINE_1 YES%NO Overwrite Existing File: # ===================================================================== # Set the type of encoding for the output file # ===================================================================== # Set line termination character DEFAULT_MACRO TEXTLINE_OUT_END_OF_LINE_TEXTLINE_1 System TEXTLINE_1_END_OF_LINE "$(TEXTLINE_OUT_END_OF_LINE_TEXTLINE_1)" GUI CHOICE TEXTLINE_OUT_END_OF_LINE_TEXTLINE_1 System%Windows%Unix%Macintosh%Source%None Line Termination: # ===================================================================== # Set whether to write the last line termination character DEFAULT_MACRO TEXTLINE_OUT_WRITE_LAST_EOL_TEXTLINE_1 YES TEXTLINE_1_WRITE_LAST_EOL "$(TEXTLINE_OUT_WRITE_LAST_EOL_TEXTLINE_1)" GUI CHOICE TEXTLINE_OUT_WRITE_LAST_EOL_TEXTLINE_1 YES%NO Write Last Line Terminator: DEFAULT_MACRO TEXTLINE_OUT_ENCODING_TEXTLINE_1 ANSI TEXTLINE_1_ENCODING "$(TEXTLINE_OUT_ENCODING_TEXTLINE_1)" GUI STRING_OR_ENCODING TEXTLINE_OUT_ENCODING_TEXTLINE_1 UTF-8%UTF-16LE%UTF-16BE%ANSI%BIG5%SJIS%CP037%CP437%CP708%CP720%CP737%CP775%CP850%CP852%CP855%CP857%CP860%CP861%CP862%CP863%CP864%CP865%CP866%CP869%CP932%CP936%CP950%CP1250%CP1251%CP1252%CP1253%CP1254%CP1255%CP1256%CP1257%CP1258%ISO8859-1%ISO8859-2%ISO8859-3%ISO8859-4%ISO8859-5%ISO8859-6%ISO8859-7%ISO8859-8%ISO8859-9%ISO8859-13%ISO8859-15 Character Encoding: # ===================================================================== # The following GUI line prompts for the overwrite flag. The default is # YES. Possible values are YES or NO. Any value other than NO or # no is interpreted as YES. DEFAULT_MACRO TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_1 YES TEXTLINE_1_WRITE_UTF8_BOM "$(TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_1)" GUI CHOICE TEXTLINE_OUT_WRITE_UTF8_BOM_TEXTLINE_1 YES%NO Write UTF Byte Order Mark # ===================================================================== # Set the mime type. Note -- it is actually only used inside of workspaces # as a FORMAT_PARAMETER which even then is parsed only by the FME Server # Repository Manager TEXTLINE_1_DATASET "$(DestDataset_TEXTLINE_1)" #! END_DEST_HEADER #! START_WB_HEADER #! END_WB_HEADER #! END_HEADER LOG_FILENAME "$(FME_MF_DIR)Convert_GRD_from Ngrid.log" LOG_APPEND NO LOG_MAX_FEATURES 200 LOG_MAX_RECORDED_FEATURES 200 FME_REPROJECTION_ENGINE FME FME_IMPLICIT_CSMAP_REPROJECTION_MODE Auto FME_GEOMETRY_HANDLING Enhanced FME_STROKE_MAX_DEVIATION 0 LOG_FILTER_MASK -1 DEFAULT_MACRO DATASET_KEYWORD_NGRID_1 NGRID_1 DEFAULT_MACRO DATASET_KEYWORD_TEXTLINE_1 TEXTLINE_1 # ------------------------------------------------------------------------- NGRID_1_READER_META_ATTRIBUTES fme_basename fme_feature_type # ------------------------------------------------------------------------- MULTI_READER_CONTINUE_ON_READER_FAILURE No # ------------------------------------------------------------------------- MACRO WORKSPACE_NAME Convert_GRD_from Ngrid MACRO FME_VIEWER_APP fmedatainspector # ------------------------------------------------------------------------- NGRID_1_DEF NGRID # ------------------------------------------------------------------------- FACTORY_DEF * RoutingFactory FACTORY_NAME "Router and Unexpected Input Remover" COMMAND_PARM_EVALUATION SINGLE_PASS MULTI_READER_KEYWORD NGRID_1 INPUT FEATURE_TYPE * ROUTE NGRID NGRID_1::NGRID TO FME_GENERIC ::NGRID ALIAS_GEOMETRY MERGE_INPUT Yes OUTPUT ROUTED FEATURE_TYPE * NGRID_1_MERGE_DEF NGRID_1::NGRID EXACT NGRID # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME "NGRID (NGRID_1) Splitter" INPUT FEATURE_TYPE NGRID OUTPUT FEATURE_TYPE NGRID_NGRID_1 DEFAULT_MACRO WB_CURRENT_CONTEXT # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME RasterPropertiesExtractor INPUT FEATURE_TYPE NGRID_NGRID_1 OUTPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT @RasterProperties(RASTER_ROTATION2D) FACTORY_DEF * TeeFactory FACTORY_NAME "RasterPropertiesExtractor OUTPUT Splitter" INPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT OUTPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_0_G3rbAaamObs= OUTPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_1_V9DxUvSwvxY= OUTPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_2_kVQsfPJRS1U= # ------------------------------------------------------------------------- FACTORY_DEF * RasterToVectorFactory FACTORY_NAME RasterCellCoercer INPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_2_kVQsfPJRS1U= PRESERVE_ATTRIBUTES NO COLUMN_ATTRIBUTE _column ROW_ATTRIBUTE _row EXTRACT_NODATA Yes CELL_GEOMETRY Points EXTRACT_VALUES_AS_ATTRIBUTES Yes OUTPUT POINTS FEATURE_TYPE RasterCellCoercer_OUTPUT # ------------------------------------------------------------------------- FACTORY_DEF * TestFactory FACTORY_NAME Tester INPUT FEATURE_TYPE RasterCellCoercer_OUTPUT TEST @EvaluateExpression(STRING_ENCODED,Value_band0.value,Tester) < 10000000 ENCODED BOOLEAN_OPERATOR OR OUTPUT PASSED FEATURE_TYPE Tester_PASSED OUTPUT FAILED FEATURE_TYPE Tester_FAILED # ------------------------------------------------------------------------- FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_4 INPUT FEATURE_TYPE Tester_FAILED ATTR value 0 OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_4_OUTPUT # ------------------------------------------------------------------------- FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_3 INPUT FEATURE_TYPE Tester_PASSED ATTR value Value_band0.value OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_3_OUTPUT # ------------------------------------------------------------------------- Tcl2 regsub {^[^a-zA-Z]*([a-zA-Z]).*} {3.3f} {\1} formatChar; if { [string first $formatChar {duiofxeEgG}] != -1 } { proc {StringFormatter_3_getAttribute} {attr} { return [regsub {^(-?)0*(.)} [FME_GetAttribute $attr] {\1\2}] } } else { proc {StringFormatter_3_getAttribute} {attr} { return [FME_GetAttribute $attr] } } Tcl2 proc StringFormatter_3_formatter {} { set attrs [split {value} {,}]; foreach attr $attrs { set attrVal [FME_GetAttribute $attr]; set length [string length $attrVal]; if {$length > 0} { FME_SetAttribute $attr [format %3.3f [{StringFormatter_3_getAttribute} $attr]]; }; }; } FACTORY_DEF * TeeFactory FACTORY_NAME StringFormatter_3 INPUT FEATURE_TYPE AttributeCreator_3_OUTPUT INPUT FEATURE_TYPE AttributeCreator_4_OUTPUT OUTPUT FEATURE_TYPE StringFormatter_3_OUTPUT @Tcl2(StringFormatter_3_formatter) # ------------------------------------------------------------------------- Tcl2 regsub {^[^a-zA-Z]*([a-zA-Z]).*} {9s} {\1} formatChar; if { [string first $formatChar {duiofxeEgG}] != -1 } { proc {StringFormatter_4_getAttribute} {attr} { return [regsub {^(-?)0*(.)} [FME_GetAttribute $attr] {\1\2}] } } else { proc {StringFormatter_4_getAttribute} {attr} { return [FME_GetAttribute $attr] } } Tcl2 proc StringFormatter_4_formatter {} { set attrs [split {value} {,}]; foreach attr $attrs { set attrVal [FME_GetAttribute $attr]; set length [string length $attrVal]; if {$length > 0} { FME_SetAttribute $attr [format %9s [{StringFormatter_4_getAttribute} $attr]]; }; }; } FACTORY_DEF * TeeFactory FACTORY_NAME StringFormatter_4 INPUT FEATURE_TYPE StringFormatter_3_OUTPUT OUTPUT FEATURE_TYPE StringFormatter_4_OUTPUT @Tcl2(StringFormatter_4_formatter) # ------------------------------------------------------------------------- FACTORY_DEF * SortFactory FACTORY_NAME Sorter_2 INPUT FEATURE_TYPE StringFormatter_4_OUTPUT SORT_BY _row NUMERIC ASCENDING _column NUMERIC ASCENDING OUTPUT SORTED FEATURE_TYPE Sorter_2_SORTED # ------------------------------------------------------------------------- # Create the DomainName that this transformer will use. # Because @Count itself will evalute the expression to calculate the # domain, we don't need to do anything in Tcl per feature going by INCLUDE [ set domainPrefix {}; if { {Global} == {Local} } { set domainPrefix [FME_EncodeText {Counter_}]; }; puts "MACRO Counter_FULL_DOMAIN ${domainPrefix}counter"; ] FACTORY_DEF * TeeFactory FACTORY_NAME Counter_Counter INPUT FEATURE_TYPE Sorter_2_SORTED @RenameAttributes(FME_STRICT,___fme_rejection_code___,fme_rejection_code) OUTPUT FEATURE_TYPE ___TOREJECTOR___ "_count" @Count(REJECTABLE,fme_encoded,$(Counter_FULL_DOMAIN),"0") FACTORY_DEF * TestFactory FACTORY_NAME Counter_Rejector INPUT FEATURE_TYPE ___TOREJECTOR___ TEST @Value(fme_rejection_code) != "" OUTPUT PASSED FEATURE_TYPE Counter_ @RemoveAttributes(___fme_rejection_code___) OUTPUT FAILED FEATURE_TYPE Counter_OUTPUT @RenameAttributes(FME_STRICT,fme_rejection_code,___fme_rejection_code___) FACTORY_DEF * TeeFactory FACTORY_NAME "Counter Output Nuker" INPUT FEATURE_TYPE Counter_ # ------------------------------------------------------------------------- FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_6 INPUT FEATURE_TYPE Counter_OUTPUT ATTR _mod_count EvaluateValue_count8 OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_6_OUTPUT # ------------------------------------------------------------------------- DEFAULT_MACRO Aggregator_BREAK_ATTR INCLUDE [if {"No" == "Yes"} {puts {MACRO Aggregator_BREAK_ATTR BREAK_BEFORE_FIELD_CHANGE _mod_count} }] FACTORY_DEF * AggregateFactory FACTORY_NAME Aggregator INPUT FEATURE_TYPE AttributeCreator_6_OUTPUT MODE ONE_LEVEL GROUP_BY _mod_count $(Aggregator_BREAK_ATTR) ACCUMULATE_ATTRIBUTES Never LIST_NAME "_list{}" SEPARATOR PRODUCE_MULTIS YES OUTPUT AGGREGATE FEATURE_TYPE Aggregator_AGGREGATE @Geometry(SET_TO_CONTAIN_INDIVIDUAL_GEOMS, NO) # ------------------------------------------------------------------------- Tcl2 set ListSorterRenamedAttrPrefix ________ Tcl2 proc ListSorter_sort {} { global ListSorterRenamedAttrPrefix; regsub \"{}.*$\" {_list{}._count} \"\{\" listBase; regsub \"{}.*$\" {_list{}._count} \"\" listName; set listBaseLen [string length $listBase]; set listNameLen [expr $listBaseLen - 1]; set listValueExtension [string replace {_list{}._count} 0 $listBaseLen {}]; set COMMENT { = For each attribute "listattr{}.count" and all related attributes = "listattr{}", create a list of the form = {$listattr{}.count } = and append the list to toSort, and keep a list of the extensions = for each index in the associative array listExtensions(). = While iterating over the attributes, rename all such attributes to = "________listattr{}" to = keep them out of the way, and to make them easier to clean up later. = = Note that we're manually pulling out the index and extension, instead = of using regular expressions, as it is much more efficient }; set toSort {}; foreach attr [FME_AttributeNames] { set attrStart [string range $attr 0 $listNameLen]; if { $attrStart == $listBase } { set braceEnd [string first \} $attr $listBaseLen]; set index [string range $attr $listBaseLen [expr $braceEnd - 1]]; set extension [string range $attr [expr $braceEnd + 1] end]; lappend listExtensions($index) $extension; if { $extension == $listValueExtension } { lappend toSort [list [FME_GetAttribute $attr] $index] }; FME_RenameAttribute "$ListSorterRenamedAttrPrefix$attr" $attr; set renamedAttrs($ListSorterRenamedAttrPrefix$attr) 1; } }; set COMMENT { = Sort the {$listattr{} } by index 0 (attr value) }; set sortedList [lsort -real -index 0 $toSort]; set destIndex 0; set COMMENT { = For each list within sortedList, iterate over the list, renaming = "________listattr{}" to = "listattr{}" }; foreach pair $sortedList { set elementNum [lindex $pair 1]; set newAttrBase "$listName\{$destIndex\}"; set oldAttrBase "$listName\{$elementNum\}"; foreach extension $listExtensions($elementNum) { FME_RenameAttribute "$newAttrBase$extension" "$ListSorterRenamedAttrPrefix$oldAttrBase$extension"; unset renamedAttrs($ListSorterRenamedAttrPrefix$oldAttrBase$extension); }; incr destIndex }; set COMMENT { = If any attributes were renamed to their temporary names above, and they = did not contain the structure extension on which we were sorting, they = will still exist on the feature, and must be cleaned up. }; foreach remainingAttr [array names renamedAttrs] { FME_UnsetAttributes $remainingAttr }; } FACTORY_DEF * TeeFactory FACTORY_NAME ListSorter INPUT FEATURE_TYPE Aggregator_AGGREGATE OUTPUT FEATURE_TYPE ListSorter_OUTPUT @Tcl2("ListSorter_sort") # ------------------------------------------------------------------------- Tcl2 set ListConcatenator__separator [FME_DecodeText {}]; regsub -all \"{}\" {_list{}.value} \"{*}\" ListConcatenator__listPattern; Tcl2 proc ListConcatenator__Concatenate {} { upvar \#0 ListConcatenator__separator separator ListConcatenator__listPattern listPattern; set allAttrs [lsort -dictionary [FME_AttributeNames]]; set keepEmptyParts [string equal {No} {No}]; set result {}; foreach attrName $allAttrs { if {[string match $listPattern $attrName]} { set attrValue [FME_GetAttribute $attrName]; if {$keepEmptyParts || $attrValue != {}} { lappend result $attrValue; }; }; }; FME_SetAttribute {"_concatenated"} [join $result $separator]; } FACTORY_DEF * TeeFactory FACTORY_NAME ListConcatenator INPUT FEATURE_TYPE ListSorter_OUTPUT OUTPUT FEATURE_TYPE ListConcatenator_OUTPUT @Tcl2(ListConcatenator__Concatenate) # ------------------------------------------------------------------------- FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_5 INPUT FEATURE_TYPE ListConcatenator_OUTPUT ATTR text_line_data Value_concatenated ATTR _sort EvaluateValue_mod_count+5 OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_5_OUTPUT # ------------------------------------------------------------------------- FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_2 INPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_0_G3rbAaamObs= ATTR _sort 1 ATTR text_line_data "" OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_2_OUTPUT # ------------------------------------------------------------------------- FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator_7 INPUT FEATURE_TYPE RasterPropertiesExtractor_OUTPUT_1_V9DxUvSwvxY= ATTR _min_x EvaluateValue_min_x+Value_spacing_x*0.5 ATTR _min_y EvaluateValue_min_y+Value_spacing_y*0.5 ATTR _max_x EvaluateValue_max_x-Value_spacing_x*0.5 ATTR _max_y EvaluateValue_max_y-Value_spacing_y*0.5 OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_7_OUTPUT # ------------------------------------------------------------------------- Tcl2 regsub {^[^a-zA-Z]*([a-zA-Z]).*} {05.8f} {\1} formatChar; if { [string first $formatChar {duiofxeEgG}] != -1 } { proc {StringFormatter_getAttribute} {attr} { return [regsub {^(-?)0*(.)} [FME_GetAttribute $attr] {\1\2}] } } else { proc {StringFormatter_getAttribute} {attr} { return [FME_GetAttribute $attr] } } Tcl2 proc StringFormatter_formatter {} { set attrs [split {_spacing_x,_spacing_y,_min_x,_min_y,_max_x,_max_y} {,}]; foreach attr $attrs { set attrVal [FME_GetAttribute $attr]; set length [string length $attrVal]; if {$length > 0} { FME_SetAttribute $attr [format %05.8f [{StringFormatter_getAttribute} $attr]]; }; }; } FACTORY_DEF * TeeFactory FACTORY_NAME StringFormatter INPUT FEATURE_TYPE AttributeCreator_7_OUTPUT OUTPUT FEATURE_TYPE StringFormatter_OUTPUT @Tcl2(StringFormatter_formatter) # ------------------------------------------------------------------------- Tcl2 regsub {^[^a-zA-Z]*([a-zA-Z]).*} {12s} {\1} formatChar; if { [string first $formatChar {duiofxeEgG}] != -1 } { proc {StringFormatter_2_getAttribute} {attr} { return [regsub {^(-?)0*(.)} [FME_GetAttribute $attr] {\1\2}] } } else { proc {StringFormatter_2_getAttribute} {attr} { return [FME_GetAttribute $attr] } } Tcl2 proc StringFormatter_2_formatter {} { set attrs [split {_spacing_x,_spacing_y,_min_x,_min_y,_max_x,_max_y} {,}]; foreach attr $attrs { set attrVal [FME_GetAttribute $attr]; set length [string length $attrVal]; if {$length > 0} { FME_SetAttribute $attr [format %12s [{StringFormatter_2_getAttribute} $attr]]; }; }; } FACTORY_DEF * TeeFactory FACTORY_NAME StringFormatter_2 INPUT FEATURE_TYPE StringFormatter_OUTPUT OUTPUT FEATURE_TYPE StringFormatter_2_OUTPUT @Tcl2(StringFormatter_2_formatter) # ------------------------------------------------------------------------- FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator INPUT FEATURE_TYPE StringFormatter_2_OUTPUT ATTR _sort 0 ATTR text_line_data Value_min_yValue_max_yValue_min_xValue_max_xValue_spacing_yValue_spacing_x OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_OUTPUT # ------------------------------------------------------------------------- FACTORY_DEF * SortFactory FACTORY_NAME Sorter INPUT FEATURE_TYPE AttributeCreator_OUTPUT INPUT FEATURE_TYPE AttributeCreator_2_OUTPUT INPUT FEATURE_TYPE AttributeCreator_5_OUTPUT SORT_BY _sort NUMERIC ASCENDING OUTPUT SORTED FEATURE_TYPE Sorter_SORTED # ------------------------------------------------------------------------- FACTORY_DEF * RoutingFactory FACTORY_NAME "Destination Feature Type Routing Correlator" COMMAND_PARM_EVALUATION SINGLE_PASS INPUT FEATURE_TYPE * ROUTE FME_GENERIC Sorter_SORTED TO TEXTLINE __GO_TO_FINAL_OUTPUT_ROUTER__ multi_writer_id,0,SupplyAttributesENCODED__wb_out_feat_type__text_line GEOMETRY FEATURE_TYPE_ATTRIBUTE __wb_out_feat_type__ OUTPUT ROUTED FEATURE_TYPE * OUTPUT NOT_ROUTED FEATURE_TYPE __nuke_me__ @Tcl2("FME_StatMessage 818059 [FME_GetAttribute fme_template_feature_type] 818060 818061 fme_warn") # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME "Final Output Nuker" INPUT FEATURE_TYPE __nuke_me__